package com.zmn.brs.services.impl.rule;

import com.zmn.brs.model.bo.rule.AlarmRuleBO;
import com.zmn.brs.model.entity.rule.AlarmRule;
import com.zmn.brs.model.entity.rule.AlarmRuleQuery;
import com.zmn.brs.persistence.interfaces.rule.AlarmRuleDao;
import com.zmn.brs.services.interfaces.rule.AlarmRuleService;
import com.zmn.manager.common.database.annotation.ReadOnlyConnection;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import javax.annotation.Resource;
import java.util.List;

/**
 * 描述: 规则基础接口实现类
 *
 * @author xujie
 * @since  2021-03-17 13:55:07
 **/
@Slf4j
@Service
public class AlarmRuleServiceImpl implements AlarmRuleService {

    private static final String TAG = "规则基础服务接口";

    @Resource
    private AlarmRuleDao alarmRuleDao;

    /**
     * 描述: 根据id查询数据
     *
     * @param ruleId id
     * @author xujie
     * @since 2021-03-17 13:55:07
     **/
    @Override
    @ReadOnlyConnection
    public AlarmRule findById(Integer ruleId) {

        Assert.notNull(ruleId, TAG + "参数 ruleId 不能为空");
        return alarmRuleDao.findById(ruleId);
    }

    /**
     * 描述: 根据事件编码查询规则ID
     *
     * @param eventCode 事件编码
     * @return ruleId 规则ID
     * @author xujie
     * @since 2021-03-17 14:45:07
     **/
    @Override
    @ReadOnlyConnection
    public List<Integer> findRuleIdByEventCode(Integer eventCode) {

        Assert.notNull(eventCode, TAG + "参数 eventCode 不能为空");
        return alarmRuleDao.findRuleIdByEventCode(eventCode);
    }

    /**
     * 描述: 根据阈值ID查询规则状态
     * @param thresholdId 阈值ID
     * @return status 状态
     * @author chongw
     * @since 2021-06-11 14:45:07
     **/
    @Override
    @ReadOnlyConnection
    public Integer getStatusByRuleThresholdId(Integer thresholdId){
        Assert.notNull(thresholdId, TAG + "参数 thresholdId 不能为空");
        return alarmRuleDao.getStatusByRuleThresholdId(thresholdId);
    }

    @Override
    @ReadOnlyConnection
    public List<Integer> findRuleIdByEventCodeAndObjectIdentity(Integer eventCode, Integer objectIdentity) {

        Assert.notNull(eventCode, TAG + "参数 eventCode 不能为空");
        Assert.notNull(eventCode, TAG + "参数 objectIdentity 不能为空");
        return alarmRuleDao.findRuleIdByEventCodeAndObjectIdentity(eventCode, objectIdentity.toString());
    }

    /**
     * 描述: 按条件查询数据 支持分页
     *
     * @param query 查询对象
     * @author xujie
     * @since 2021-03-17 13:55:07
     **/
    @Override
    @ReadOnlyConnection
    public List<AlarmRule> listPageByQuery(AlarmRuleQuery query) {

        Assert.notNull(query, TAG + "参数 query 不能为空");
        query.setTotalCount(alarmRuleDao.countByQuery(query));
        return alarmRuleDao.listPageByQuery(query);
    }

    /**
     * 描述: 按条件查询数据 不支持分页
     *
     * @param query 查询对象
     * @author xujie
     * @since 2021-03-17 13:55:07
     **/
    @Override
    @ReadOnlyConnection
    public List<AlarmRule> listByQuery(AlarmRuleQuery query) {

        Assert.notNull(query, TAG + "参数 query 不能为空");
        return alarmRuleDao.listByQuery(query);
    }

    @Override
    @ReadOnlyConnection
    public List<AlarmRuleBO> listAlarmRuleBOByQuery(AlarmRuleQuery query) {

        Assert.notNull(query, TAG + "参数 query 不能为空");
        return alarmRuleDao.listAlarmRuleBOByQuery(query);
    }

    /**
     * 描述: 按条件查询数据 不支持分页
     *
     * @param query 查询对象
     * @author xujie
     * @since 2021-03-17 13:55:07
     **/
    @Override
    @ReadOnlyConnection
    public Integer countByQuery(AlarmRuleQuery query) {

        Assert.notNull(query, TAG + "参数 query 不能为空");
        return alarmRuleDao.countByQuery(query);
    }

    /**
     * 描述: 根据id修改数据 id为必传
     *
     * @param alarmRule 待修改数据
     * @return java.lang.Integer
     * @author xujie
     * @since 2021-03-17 13:55:07
     **/
    @Override
    public Integer updateByKey(AlarmRule alarmRule) {

        Assert.notNull(alarmRule, TAG + "参数 alarmRule 不能为空");
        Assert.notNull(alarmRule.getRuleId(), TAG + "字段 ruleId 不能为空");
        return alarmRuleDao.updateByKey(alarmRule);
    }

    /**
     * 描述: 批量修改数据
     * @param alarmRuleList 数据集合
     * @return java.lang.Integer 成功个数
     * @author xujie
     * @since  2021-03-17 13:55:07
     */
    @Override
    public Integer updateBatchByKey(List<AlarmRule> alarmRuleList) {

        if (alarmRuleList == null || alarmRuleList.size() == 0) {
            return null;
        }
        return alarmRuleDao.updateBatchByKey(alarmRuleList);
    }

    /**
     * 描述: 新增数据
     *
     * @param alarmRule 待新增数据
     * @return java.lang.Integer 主键key
     * @author xujie
     * @since  2021-03-17 13:55:07
     **/
    @Override
    public Integer insert (AlarmRule alarmRule) {

        Assert.notNull(alarmRule, TAG + "参数 alarmRule 不能为空");
        return alarmRuleDao.insert(alarmRule);
    }

    /**
     * 描述: 批量新增数据
     * @param alarmRuleList 待新增数据集合
     * @return java.lang.Integer 成功个数
     * @author xujie
     * @since  2021-03-17 13:55:07
     */
    @Override
    public Integer insertBatch(List<AlarmRule> alarmRuleList) {

        if (alarmRuleList == null || alarmRuleList.size() == 0) {
            return null;
        }
        return alarmRuleDao.insertBatch(alarmRuleList);
    }

    /**
     * 描述: 根据主键删除数据
     *
     * @param ruleId 主键
     * @return 执行结果码
     * @author xujie
     * @since 2021-03-17 13:55:07
     */
    @Override
    public Integer deleteByKey(Integer ruleId) {

        Assert.notNull(ruleId, TAG + "参数 ruleId 不能为空");
        return alarmRuleDao.deleteByKey(ruleId);
    }

    /**
     * 描述: 根据主键批量删除数据
     *
     * @param ruleIdList 待新增数据集合
     * @return java.lang.Integer 成功个数
     * @author xujie
     * @since  2021-03-17 13:55:07
     */
    @Override
    public Integer deleteBatchByKey(List<Integer> ruleIdList) {

        if (ruleIdList == null || ruleIdList.size() == 0) {
            return null;
        }
        return alarmRuleDao.deleteBatchByKey(ruleIdList);
    }

}